iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0

接下來我們來學習一種暴力跑過所有可能的方法,DFS 深度優先搜尋。

為了方便解釋,我們的範例使用資結那堂課曾經寫過的樹喔。

tree_0.webp

import java.util.LinkedList

class Node{
    var data:Int = 0
    var son:LinkedList<Node> = LinkedList<Node>()
    fun addSon(new_son_data:Int){
        var new_son = Node()
        new_son.data = new_son_data
        son.add(new_son)
    }
}

class Tree{
    var root = Node()
}

fun main(){
    var tree = Tree()
    tree.root.data = 1
    tree.root.addSon(2)
    tree.root.addSon(3)
    tree.root.son[0].addSon(4)
    tree.root.son[0].addSon(5)
    tree.root.son[0].son[1].addSon(6)
    tree.root.son[0].son[1].addSon(7)
    tree.root.son[0].son[1].addSon(8)
}

我們的這次的目標是要顯示樹上所有節點的值,深度優先搜尋的概念簡單來說就是只要樹有孩子就先看孩子,然後從左至右的遍歷。

我們通常會善用遞迴來做到這件事情,這個可能很難理解,要好好讀這段程式碼喔。

fun dfs(now:Node){
    print(" ${now.data} ")
    if (now.son.size!=0){
        print("{")
    }
    for(i in 0 .. now.son.size-1){
        dfs(now.son[i])
    }
    if (now.son.size!=0){
        print("} ")
    }
}

輸出結果長這樣,是不是成功print出我們的樹了呢。

1 { 2 { 4  5 { 6  7  8 } }  3 }

基本上dfs可以拿來做到各種暴力找出答案的方法,包括下棋也可以用dfs來找出最合適的走法(當然那還有其他複雜的事情要解決,比如怎麼判斷哪一步是好的)。


上一篇
[Day26] [演算法]二分搜
下一篇
[Day28][演算法]BFS
系列文
櫛風風的「完全不會寫程式,從零開始的 Kotlin 教學」30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言